/******************************************************************
 *      Equation Parser Utility Class                             *
 *                                                                *
 *  Please report bugs, incorrect coding, enhancements and        *
 *  updates to the wizardscripts forum                            *
 *  at www.wizardscripts.com/forum                                *
 *                                                                *
 *	Rights: The author retains all rights to this script      *
 ******************************************************************/
/** 
 * @main    Plik z deklaracjami klasy Matrix
 * @file    macierz.h
 * @author  www.wizardscripts.com/forum
 * @modified Grzegorz Sejnota
 *
 * @created on 19 marca 2009, 10:41
 * @version 0.0001
 */

#ifndef _MACIERZ_H
#define	_MACIERZ_H

#include <vector>
#include <deque>
#include <iosfwd>

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZATEK [klasy Macierz] ++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
 * Klasa reprezentujaca macierz. Udostepnia podstawowe operacje na macierzach
 * takie jak mnozenie, dodawanie, transpozycja. 
 */
class Macierz {
    /// wektor wektorow - macierz 
    std::vector< std::vector<double> > macierz;
    
public:
    /* konstruktor domyslny */
    Macierz();
    
    /* konstruktor konwertujacy z typu double */
    Macierz(double);
    
    /* konstruktor macierzy o wymiarach int int */
    Macierz(int, int, double=0);
    
    /* konstruktor z wektora wektorow */
    Macierz(const std::vector< std::vector<double> > &);
    
    /* konstruktor z wektora */
    Macierz(const std::vector<double> &, bool wierszowy=true);
    
    /* konstruktor z deque */
    Macierz(const std::deque<double> &, bool wierszowy=true);
    
    /* metoda statyczna zwracajaca macierz jednostkowa o podanym wymiarze */
    static Macierz I(int);
    
    /* konstruktor kopiujacy */
    Macierz(const Macierz &);
    
    /* destruktor */
    ~Macierz();

    /* funkcja obliczajaca wyznacznik*/
    double obliczWyznacznik();
    
    /* funkcja obliczajaca slad */
    double obliczSlad();
    
    /* odwracanie macierzy */
    Macierz odwroc() const;
    
    /* transponowanie macierzy */
    Macierz transponuj() const;

    /* pobranie liczby wierszy */
    int liczbaWierszy() const;
    
    /* pobranie liczby kolumn */
    int liczbaKolumn() const;
    
    /* pobranie wiersza o podanym numerze */
    std::vector<double> wiersz(int) const;
    
    /* pobranie kolumny o podanym numerze */
    std::vector<double> kolumna(int) const;
    
    /* pobranie elementu o indeksie int int */
    double & at(int, int);

    /* przeladowane operatory */
    Macierz operator+=(const Macierz &);
    Macierz operator-=(const Macierz &);
    Macierz operator*=(const Macierz &);
    Macierz operator/=(const Macierz &);
    double operator() (int, int) const;
    Macierz & operator =(const Macierz &wzor);
    std::vector<double> & operator[](int);
    
    /* deklaracja przyjazni z przeladowanymi operatorami */
    friend std::ostream & operator<<(std::ostream&, const Macierz&);
    friend bool operator== ( const Macierz &, const Macierz & );
    friend bool operator!= ( const Macierz &, const Macierz & );
    friend Macierz operator+ ( const Macierz &, const Macierz &);
    friend Macierz operator- ( const Macierz &);
    friend Macierz operator- ( const Macierz &, const Macierz &);
    friend Macierz operator* ( const Macierz &, const Macierz &);
    friend Macierz operator/ ( const Macierz &, const Macierz &);

};
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ KONIEC [klasy Macierz] ++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#endif	/* _MACIERZ_H */
